# 协程 是一种用户态的轻量级的线程 可以理解为在线程里面跑的子线程 默认空间很小
import asyncio
import time

# def hello(msg):
#     print(f'hello{msg}')
#
#
# # 定义一个异步函数
#
# async def test1():
#     print('test1')
#     # 执行到这里时 挂起当前协程 等待一秒钟
#     # 当该协程挂起时，可以去执行其它的协程（异步任务）
#     await asyncio.sleep(1)  # 目的：切换
#     # time.sleep(1)  # 不会进程协程的切换，只会让当前的线程挂起，并且等待一分钟
#     print('word')
#
#
# hello('111')
# # 创建一个协程
# coroutine = test1()
# print(coroutine)
#
# # 启动协程 协程就是来执行某个异步函数的
# asyncio.run(coroutine, debug=False)


# 多协程任务
# async def eat():
#     for i in range(6):
#         print(f'正在吃饭{i}')
#         await asyncio.sleep(0.5)
#
#
# async def work():
#     for i in range(6):
#         print(f'正在做作业{i}')
#         await asyncio.sleep(0.5)
#
#
# async def main():  # 其它协程的入口
#     # await eat()
#     # await work()
#
#     await asyncio.gather(eat(),work()) # 多个协程同步执行
#
#
# if __name__ == '__main__':
#     start = time.time()
#     asyncio.run(main())
#     print(f'整个耗时：{time.time() - start}')

# 多任务异步
async def eat():
    for i in range(6):
        print(f'吃饭{i}')
        await asyncio.sleep(0.5)
    return '吃饭完成' # 协程的返回值
async def work():
    for i in range(6):
        print(f'工作{i}')
        await asyncio.sleep(0.5)
    return '做作业完成' # 协程的返回值

async def main():
    task1 = asyncio.create_task(eat())
    task2 = asyncio.create_task(work())
    task1.cancel()

    # await  task1
    # await  task2
    # 仅仅得到函数的返回值
    # res = await asyncio.gather(task1,task2) # 当第一个协程强制终止 会影响第二个协程

    res = await asyncio.wait([task1,task2])
    print(res)

if __name__ == '__main__':
    start = time.time()
    asyncio.run(main())
    print(f'耗时{time.time() - start}')

